package arrayqueue

import (
	"06-GenericsTest/lists/arraylist"
	"06-GenericsTest/queues"
	"fmt"
	"strings"
)

var _ queues.Queue[int] = (*Queue[int])(nil)

// Queue 队列结构
type Queue[T comparable] struct {
	list *arraylist.List[T]
}

// New 创建队列
func New[T comparable]() *Queue[T] {
	return &Queue[T]{list: arraylist.New[T]()}
}

// Enqueue 入队
func (q *Queue[T]) Enqueue(value T) {
	q.list.Add(value)
}

// Dequeue 出队
func (q *Queue[T]) Dequeue() (value T, ok bool) {
	value, ok = q.list.Get(0)
	if ok {
		q.list.Remove(0)
	}
	return
}

// Peek 队头元素
func (q *Queue[T]) Peek() (value T, ok bool) {
	return q.list.Get(0)
}

// Empty 判断队列为空
func (q *Queue[T]) Empty() bool {
	return q.list.Empty()
}

// Size 获取队列元素个数
func (q *Queue[T]) Size() int {
	return q.list.Size()
}

// Clear 清空队列
func (q *Queue[T]) Clear() {
	q.list.Clear()
}

// Values 获取队列元素切片
func (q *Queue[T]) Values() []T {
	return q.list.Values()
}

// String 字符串显示队列
func (q *Queue[T]) String() string {
	str := "ArrayQueue: "
	values := []string{}
	for _, value := range q.list.Values() {
		values = append(values, fmt.Sprintf("%v", value))
	}
	str += "[" + strings.Join(values, ", ") + "]"
	return str
}
